<?php
require './function.php';
/**
 * @Author: Wherein
 * @Date: 2021-04-05 17:49
 * @Descripttion: 策略模式
 * @example 如果我们现在在做一个商城，用户来了，我们想向其推荐对应的商品。比如说一个女性用户登录的话，我们就问她需要衣服，男性用户就推荐螺丝刀，不确定性别就推荐《葵花宝典》
 */

// 抽象策略接口
abstract class Strategy{
    abstract function peddle();
}

// 具体封装的策略方法   女性用户策略
class ConcreteStrategyA extends Strategy{
    public function peddle()
    {
        dd('美女穿这件衣服肯定很好看');
    }
}

class ConcreteStrategyB extends Strategy{
    public function peddle()
    {
        dd('每一个男人都需要一个工具箱，充实工具箱，从购买各种螺丝刀开始');
    }
}

class ConcreteStrategyC extends Strategy{
    public function peddle(){
        dd('骨骼清奇，适合《葵花宝典》');
    }
}

// 环境类
class Context{
    protected $strategy;
    public function __construct(Strategy $strategy)
    {
        $this->strategy = $strategy;
    }

    public function request() {
        $this->strategy->peddle($this);
    }
}


// 若处于女性用户环境
$female_context = new Context(new ConcreteStrategyA);
$female_context->request();
// 若处于男性用户环境
$female_context = new Context(new ConcreteStrategyB);
$female_context->request();
// 若处于未知性别用户环境
$unknow_context = new Context(new ConcreteStrategyC);
$unknow_context->request();